package file

import (
	"errors"
	"io"
	"io/ioutil"
	"mime/multipart"
	"os"
	"path"
)

// 获取文件大小
func GetSize(f multipart.File) (int, error) {
	content, err := ioutil.ReadAll(f)

	return len(content), err
}

// 获取文件后缀
func GetExt(filename string) string {
	return path.Ext(filename)
}

// 检查文件是否存在
func CheckNotExist(src string) bool {
	_, err := os.Stat(src)

	return os.IsNotExist(err)
}

// 检查文件权限
func CheckPermission(src string) bool {
	_, err := os.Stat(src)

	return os.IsPermission(err)
}

// 如果不存在则新建文件夹
func IsNotExistMkDir(src string) error {
	if notExist := CheckNotExist(src); notExist == true {
		if err := MkDir(src); err != nil {
			return err
		}
	}

	return nil
}

// 新建文件夹
func MkDir(src string) error {
	err := os.MkdirAll(src, os.ModePerm)
	if err != nil {
		return err
	}

	return nil
}

// 打开文件
func Open(name string, flag int, perm os.FileMode) (*os.File, error) {
	f, err := os.OpenFile(name, flag, perm)
	if err != nil {
		return nil, err
	}

	return f, nil
}

// 创建文件
func CreateFile(filePath, filename string, isTruncate bool) (*os.File, error) {
	targetPath := path.Join(filePath, filename)
	if !isTruncate && !CheckNotExist(targetPath) {
		return nil, errors.New("file is already exist")
	}

	err := IsNotExistMkDir(filePath)
	if err != nil {
		return nil, err
	}

	target, err := os.Create(targetPath)
	if err != nil {
		return nil, err
	}

	return target, nil
}

// 创建并写入字节内容
func WriteFileWithBytes(filePath, filename string, content []byte) error {
	file, err := CreateFile(filePath, filename, false)
	if err != nil {
		return err
	}
	defer file.Close()
	_, err = file.Write(content)
	return err
}

// 强制创建并写入字节内容
func ForceWriteFileWithBytes(filePath, filename string, content []byte) error {
	file, err := CreateFile(filePath, filename, true)
	if err != nil {
		return err
	}
	defer file.Close()

	_, err = file.Write(content)

	return err
}

// 创建并从 io.Reader 中写入内容
func WriteFileWithReader(filePath, filename string, source io.Reader) error {
	file, err := CreateFile(filePath, filename, false)
	if err != nil {
		return err
	}
	defer file.Close()

	_, err = io.Copy(file, source)
	return err
}

// 强制创建并从 io.Reader 中写入内容
func ForceWriteFileWithReader(filePath, filename string, source io.Reader) error {
	file, err := CreateFile(filePath, filename, true)
	if err != nil {
		return err
	}
	defer file.Close()

	_, err = io.Copy(file, source)
	return err
}

// 删除文件
func Remove(filePath string) error {
	return os.Remove(filePath)
}
